<?php

class LiquidacionesController extends Controller
{
	/**
	 * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
	 * using two-column layout. See 'protected/views/layouts/column2.php'.
	 */
	public $layout='//layouts/column2';

	/**
	 * @return array action filters
	 */
	public function filters()
	{
		return array(
			'rights', // perform access control for CRUD operations
		);
	}

	/**
	 * Specifies the access control rules.
	 * This method is used by the 'accessControl' filter.
	 * @return array access control rules
	 */
	public function accessRules()
	{
		return array(
			array('allow',  // allow all users to perform 'index' and 'view' actions
				'actions'=>array('index','view'),
				'users'=>array('*'),
			),
			array('allow', // allow authenticated user to perform 'create' and 'update' actions
				'actions'=>array('create','update'),
				'users'=>array('@'),
			),
			array('allow', // allow admin user to perform 'admin' and 'delete' actions
				'actions'=>array('admin','delete'),
				'users'=>array('admin'),
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

	/**
	 * Displays a particular model.
	 * @param integer $id the ID of the model to be displayed
	 */
	public function actionView($id)
	{
		$this->render('view',array(
			'model'=>$this->loadModel($id),
		));
	}

	/**
	 * Creates a new model.
	 * If creation is successful, the browser will be redirected to the 'view' page.
	 */
	public function actionCreate()
	{
		$model=new Liquidaciones;

		// Uncomment the following line if AJAX validation is needed
		// $this->performAjaxValidation($model);

		if(isset($_POST['Liquidaciones']))
		{
			$model->attributes=$_POST['Liquidaciones'];
			if($model->save())
				$this->redirect(array('view','id'=>$model->id_liquidacion));
		}

		$this->render('create',array(
			'model'=>$model,
		));
	}

	/**
	 * Updates a particular model.
	 * If update is successful, the browser will be redirected to the 'view' page.
	 * @param integer $id the ID of the model to be updated
	 */
	public function actionUpdate($id)
	{
		$model=$this->loadModel($id);

		// Uncomment the following line if AJAX validation is needed
		// $this->performAjaxValidation($model);

		if(isset($_POST['Liquidaciones']))
		{
			$model->attributes=$_POST['Liquidaciones'];
			if($model->save())
				$this->redirect(array('view','id'=>$model->id_liquidacion));
		}

		$this->render('update',array(
			'model'=>$model,
		));
	}

	/**
	 * Deletes a particular model.
	 * If deletion is successful, the browser will be redirected to the 'admin' page.
	 * @param integer $id the ID of the model to be deleted
	 */
	public function actionDelete($id)
	{
		$this->loadModel($id)->delete();

		// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
		if(!isset($_GET['ajax']))
			$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));
	}

	/**
	 * Lists all models.
	 */
	public function actionIndex()
	{

		if(isset($_GET["Generar_Liquidaciones"]))
		{
			$asistencias = Asistencias::model()->findAll();
			foreach ($asistencias as $asistencia) {
				$this->actionGenerarLiquidaciones($asistencia->id,$asistencia->id_curso,$asistencia->mes);
			}	

			
		}


		/*if(isset($_GET["Generar_Reporte"]))
		{
			$asistencias = Asistencias::model()->findAll();
			foreach ($asistencias as $asistencia) {
				$this->actionGenerarReportesliquidacion($asistencia->id,$asistencia->id_curso,$asistencia->mes);
			}	

			
		}*/


		$dataProvider=new CActiveDataProvider('Liquidaciones');
			$this->render('index',array(
				'dataProvider'=>$dataProvider,
			));
	

	
	
	
	}

	/**
	 * Manages all models.
	 */

protected function actionGenerateReporte($profesor_id,$horario_id,$curso_id,$fecha,$start_date,$end_date,$datos){
		
		
	  	$marcaciones = Marcaciones::model()->findAllByAttributes(array('id'=>$profesor_id));
	  	$marcaciones_salida = Marcaciones::model()->findAllByAttributes(array('id'=>$profesor_id,'tipo_marcacion'=>'S'));
		
		
		$aux_date = $start_date;
		$hora_clases_total = 0; 
 		$hora_clases_asistidas = 0;
		$marcacion_f_salida = NULL;
		$marcacion_h_salida = NULL;
		$ban = 0;
		//date('m',strtotime($stop_date)
		
		while (strtotime($aux_date) <= strtotime($end_date.'+1 day')) {		 		
			if(strtotime($end_date.'+1 day' ) != strtotime($aux_date)){			
					
					foreach ($marcaciones_salida as $marcacion_salida) {
						//echo '<br> Hora de salida '.$marcacion_salida->tiempo.'Tipo de Marcacion :'.$marcacion_salida->tipo_marcacion;
						$marcacion_f_salida = $this->generarDia($marcacion_salida->tiempo);
						$marcacion_h_salida = $this->generarHora($marcacion_salida->tiempo);
						
						if(strtotime($marcacion_f_salida) == strtotime($aux_date)){
							//echo '<br> Fecha de la Marcacion: '.$marcacion_salida->tiempo;
							$marcacion_f_salida = $this->generarDia($marcacion_salida->tiempo);
							break;
						}
					}

					$clases = Clases::model()->findAllByAttributes(array('id'=>$profesor_id,'fecha'=>$aux_date,'id_horario'=>$horario_id));
					/*echo '<br>'.$profesor_id.$horario_id;
				  	print_r($clases);
				  	echo '<br>';*/

					foreach ($clases as $clase) { // SUMA TOTAL DE HORAS DE CLASE EN EL MES.
									$clase_fecha = $this->generarDia($clase->fecha);
									if(strtotime($clase_fecha) == strtotime($aux_date)){
											
											$hora_aux = strtotime($clase->hora_fin) - strtotime($clase->hora_inicio);
											$hora_clases_total = $hora_clases_total + $hora_aux;
							 			
									}	
					}
					
					$suspensiones = Suspensiones::model()->findAll();
					foreach ($suspensiones as $suspension) {	
							$suspension_fecha_i = $this->generarDia($suspension->fecha_inicio);
							$marcacion_hora_i = $this->generarHora($suspension->fecha_inicio);
							$suspension_fecha_f = $this->generarDia($suspension->fecha_fin);
							$marcacion_hora_f = $this->generarHora($suspension->fecha_fin);
							if(strtotime($suspension_fecha_i) <= strtotime($aux_date) && strtotime($suspension_fecha_f) >= strtotime($aux_date)){
								$ban = 1;
								break;
							}else{
								$ban = 0; 
							}
					}
					
						foreach ($clases as $clase) {
							//echo '<br><br> ->>>>>>>>>> Fecha de la clase: '.$clase->fecha.' '.$clase->id_horario;
							
							
							if(strtotime($marcacion_f_salida) == strtotime($aux_date)){

											foreach ($marcaciones as $marcacion) { //SUMA DE LAS HORAS QUE ASISTIO UN PROFESOR
												
											$marcacion_fecha = $this->generarDia($marcacion->tiempo);
											$marcacion_hora = $this->generarHora($marcacion->tiempo);
											if($ban == 0){

													if($clase->fecha == $marcacion_fecha && $marcacion->tipo_marcacion == 'E'){
														//echo '<br><br> ->>>>>>>>>> Fecha de marcacion: '.$marcacion_fecha.' Tipo de marcacion: '.$marcacion->tipo_marcacion;
														if($this->tolerancia($marcacion_hora,$clase->hora_inicio)){
															//----echo '<br> Llego a las: '.$marcacion_hora.'       Clase hora inicio:'.$clase->hora_inicio; 
															$marcacionEntrada = $marcacion_hora;
															if(strtotime($marcacion_h_salida) >= strtotime($clase->hora_fin)){
																$hora_aux = strtotime($clase->hora_fin) - strtotime($clase->hora_inicio);
																//----echo '<br>'.' Marco salida a las: '.$marcacion_h_salida.' Clase hora fin: '.$clase->hora_fin;	
																$marcacionSalida = $marcacion_h_salida;
																$hora_clases_asistidas =  $hora_aux;
																//----echo '<br> Horas programadas: '.$hora_clases_asistidas/3600;
																//$clase->hora_inicio = 'NULL';
															}else{
																if(strtotime($marcacion_h_salida) >= strtotime($clase->hora_inicio)){
																	$hora_aux = strtotime($marcacion_h_salida) - strtotime($clase->hora_inicio);
																	//----echo '<br>'.' Marco salida a las: '.$marcacion_h_salida.'Clase Hora fin: '.$clase->hora_fin;
																	$marcacionSalida = $marcacion_h_salida;
																	$hora_clases_asistidas =  $hora_aux;
																	//----echo '<br>'.'Horas programadas: '.$hora_clases_asistidas/3600;
																	//$clase->hora_inicio = 'NULL';
																}
															}
														}else{
																
																if(strtotime($clase->hora_fin) > strtotime($marcacion_h_salida)){

																	//----echo '<br> Ausente: marco 00:00:00 Clase hora inicio'.$clase->hora_inicio; 
																	$marcacionEntrada = '00:00:00';	
																	$marcacionSalida = '00:00:00';
																}elseif(strtotime($clase->hora_fin) > strtotime($marcacion_hora)){
																	//----echo '<br> Llego tarde: '.$marcacion_hora.'       Clase hora inicio:'.$clase->hora_inicio;
																	$marcacionEntrada = $marcacion_hora;
																	$hora_clases_asistidas =  $hora_aux - $marcacion_hora;
																}else{
																	//----echo '<br> Ausente: marco 00:00:00 Clase hora inicio'.$clase->hora_inicio;
																	$marcacionEntrada = '00:00:00';
																	$marcacionSalida = '00:00:00';
																}
														}
													}
											}else{
												$hora_aux = strtotime($clase->hora_fin) - strtotime($clase->hora_inicio);
												$hora_clases_asistidas =  $hora_aux;
												$clase->hora_inicio = 'NULL';
												$ban = 0;
											}			
										}

						}else{
							//----echo '<br> Ausente2: marco 00:00:00 Clase hora inicio'.$clase->hora_inicio;
							$marcacionEntrada = '00:00:00';
							$marcacionSalida = '00:00:00';
						}
						$monto = Categorias::model()->findByAttributes(array('id_curso'=>$curso_id,'id'=>$profesor_id));
						$datos[]= array('Clase'=>$clase->nombre,'fecha' =>$clase->fecha,'inicio'=>$clase->hora_inicio,'fin'=>$clase->hora_fin,
										'horasprogramadas'=>$hora_aux/3600,
										'horasasistidas'=>round($hora_clases_asistidas/3600,3),'sueldoXhora'=>$monto->monto,'monto'=>($monto->monto*round($hora_clases_asistidas/3600,3)));
											$hora_clases_asistidas = 0;
						//$datos[]=array('fecha' => $clase->fecha,'id_clase'=>$clase->id_horario);
						
					}	

					$aux_date = date("Y-m-d",strtotime($aux_date."+1 day"));
			}else{

					/*$hora_clases_asistidas = $hora_clases_asistidas/3600;
					$hora_clases_asistidas = round($hora_clases_asistidas,1);
					$hora_clases_total = $hora_clases_total/3600;
					$hora_clases_total = round($hora_clases_total,1);
					$ausencias = $hora_clases_total - $hora_clases_asistidas;*/
						
						  /*	$fechaAhora = new CDbExpression('NOW()');   
						    $model = new asistencias;
						    $model->id = $profesor_id;
						    $model->fecha = $fechaAhora;
						    $model->asistencia_total = $hora_clases_asistidas;
						   	$model->asistencia_requerida = $hora_clases_total;
						  	$model->ausencias = $ausencias;
						  	$model->id_curso = $curso_id;
						  	$mes_model = date('m', strtotime($start_date));
						  	$model->mes = $mes_model; //ESTE SE USA
						  	//$model->mes = 5;
						  	$categoria_monto = Categorias::model()->findByAttributes(array('id'=>$profesor_id,'id_curso'=>$curso_id));
						   	$model->save();*/
							
						
									
						  	
	  					
					
					break;
			}
	
		}
			   
                     /* echo '<pre>';      
                      print_r($datos);
                      echo '</pre>' ; */  
                      return $datos;           	
              
                                        
	}

	public function actionGenerar_reportes()
	{

			/*echo '<pre>';
			print_r($_POST);
			echo '</pre>';	*/

			if(isset($_POST['month']) && isset($_POST['periodo']) && isset($_POST['profesor']))
		{
			//Preparando variables.
			$periodo_lectivo_actual = Periodoslectivos::model()->findByAttributes(array('periodo_actual' => TRUE));
			$auxstring = $_POST['periodo'];
			$periodo_inicio = substr($auxstring,0,-10);
			$periodo_fin = substr($auxstring,10,20);
			$mes_elegido = $_POST['month'];
			$fecha_elegida_inicio = $this->gendate($mes_elegido,$periodo_inicio);
			$fecha_elegida_fin = new DateTime( $fecha_elegida_inicio ); 
			$fecha_elegida_fin = $fecha_elegida_fin->format( 'Y-m-t' );
			
			$idProfesor = $_POST['profesor'];
			$ban = 0;
			if($mes_elegido != 0){
				if (strtotime($periodo_fin) >= strtotime($fecha_elegida_inicio)) {
					if (strtotime($periodo_inicio) <= strtotime($fecha_elegida_fin)) {
						$ban = 1;
					}else{
						Message::flash('error', 'El mes elegido no corresponde al periodo lectivo ');
					}
				}else{
					Message::flash('error', 'El mes elegido no corresponde al periodo lectivo ');
				}
			}else{
				$ban =1;
			}

			if($mes_elegido == NULL || $auxstring == NULL || $idProfesor == NULL){
				Message::flash('error', 'Ningun campo puede ser nulo');
				$ban = 0;
			}

			if($ban == 1){
			//$mesM = date("m");
			$profesores = Profesores::model()->findAll();
			$categorias = Categorias::model()->findAll();
			$horarios = Horarios::model()->findAll();	
			$asistenciasFechaUltima = Asistencias::model()->find(array('order'=> 'fecha DESC'));	
			//$periodo_lectivo_actual = Periodoslectivos::model()->findByAttributes(array('periodo_actual' => TRUE));
			$fecha = date('Y-m-d');
			if($mes_elegido != 0){
		  		$start_date = $fecha_elegida_inicio;
		  	}else{
		  		$start_date = $periodo_lectivo_actual->inicio;
		  	}
		  	//echo '<br> Mes de periodo a hacer, fecha inicio: '.$periodo_lectivo_actual->inicio;
		  	$present_date = date('Y-m-d');
		  	$end_date = new DateTime( $start_date ); 
		  	$end_date = $end_date->format( 'Y-m-t' );
		  	if($mes_elegido != 0){
		  		$end_date = $fecha_elegida_fin;
			}
			if (strtotime($present_date) >= strtotime($periodo_lectivo_actual->fin)) {
				if($mes_elegido != 0){
					$stop_date = $fecha_elegida_fin;
				}else{
					$stop_date = $periodo_lectivo_actual->fin;
				}
			}else{
				$stop_date = $fecha_elegida_fin;
			}

			
		  	//echo '<br> Mes de periodo a hacer, fecha fin:  '.$end_date;

			//echo $asistenciasFechaUltima->fecha;
			
			/*if($asistenciasFechaUltima == NULL){
	  		}else{
	  			$start_date = $asistenciasFechaUltima->fecha; 
	  		}*/

	  		//----echo $start_date;


	  		//echo $asistenciasFechaUltima->fecha;
			$datos[] = array();
	  		while (date('m',strtotime($end_date )) <= date('m',strtotime($stop_date))) {
	  			//----echo '<br>----------------------->'.$end_date;
	  			//----echo '<br>----------------------->'.$stop_date;
	  			if( $idProfesor != 0){
				//foreach ($profesores as $profesor) {
						//$this->actionGenerateAsistencias($profesor->id);
						//echo '<br> id Profesor: '.$profesor->id;
					foreach ($categorias as $categoria) {
						
						if($categoria->id == $idProfesor){
							//	echo 'id Curso: '.$categoria->id_curso.'<br>';
							foreach ($horarios as $horario) {
								if ($horario->id_curso == $categoria->id_curso ){
										//echo 'id horario '.$horario->id_horario.'<br>';
										
										$datos = $this->actionGenerateReporte($idProfesor,$horario->id_horario,$categoria->id_curso,$fecha,$start_date,$end_date,$datos);

								} 
							}
						}
					}
					
				//}
				}else{
					foreach ($profesores as $profesor) {
							//$this->actionGenerateAsistencias($profesor->id);
							//echo '<br> id Profesor: '.$profesor->id;
						foreach ($categorias as $categoria) {
							
							if($categoria->id == $profesor->id){
								//	echo 'id Curso: '.$categoria->id_curso.'<br>';
								foreach ($horarios as $horario) {
									if ($horario->id_curso == $categoria->id_curso ){
											//echo 'id horario '.$horario->id_horario.'<br>';
											
											$datos = $this->actionGenerateReporte($profesor->id,$horario->id_horario,$categoria->id_curso,$fecha,$start_date,$end_date,$datos);

									} 
								}
							}
						}
					
					}
				}

				$start_date = date("Y-m-01",strtotime($start_date."+1 month"));
				$end_date = date("Y-m-t",strtotime($start_date));
				//echo '<br> fecha inicio del proximo mes: '.$start_date;
				//echo '<br> fecha fin del proximo mes: '.$end_date;
			}
			if($idProfesor != 0){
					$nombreprofesores = Profesores::model()->with('id0.profile')->findAll(array('order'=>'lastname ASC, firstname ASC'));
				  foreach($nombreprofesores as $nombreprofesor) {
				  			if($idProfesor == $nombreprofesor->id){
							$nombre = $nombreprofesor->id0->profile->fullname;
							}
					}
					 
					if($mes_elegido != 0){	  
                    	$content=$this->renderPartial("reporte",array("profesor"=>$nombre,"start_date"=>$fecha_elegida_inicio,"end_date"=>$fecha_elegida_fin,"datos"=>$datos,true));
                    	
                	}else{
                		$content=$this->renderPartial("reporte",array("profesor"=>$nombre,"start_date"=>$periodo_lectivo_actual->inicio,"end_date"=>$periodo_lectivo_actual->fin,
                						"datos"=>$datos,true));
                						
                	}
                	//echo '<pre>';
                	//print_r($datos);
                	//echo end( end($datos));
                	//echo '</pre>';
                	
                    Yii::app()->request->sendFile("liquidacion.xls",$content);
			}else{
				 	/*echo '<pre>';
                	//print_r($datos);
                	echo end( end($datos));
                	echo '</pre>';*/
                    $content=$this->renderPartial("reporte",array("profesor"=>' ',"start_date"=>$fecha_elegida_inicio,"end_date"=>$fecha_elegida_fin,"datos"=>$datos,true));
                    Yii::app()->request->sendFile("liquidacion.xls",$content);
			}
					  		 
						

			
		
			/*$model=asistencias::model()->findAll();
			$content=$this->renderPartial("reporte",array("model"=>$model),true);
			Yii::app()->request->sendFile("asistencia.xls",$content);*/
		
			}

		}	
			
			
					
				$dataProvider=new CActiveDataProvider('Asistencias');
				$this->render('generar_reportes',array(
					'dataProvider'=>$dataProvider,
				));
		
	}


	protected function generarHora($mtime)
	{
		return Yii::app()->dateFormatter->format('HH:mm:ss', $mtime);
	}

	protected function generarDia($mtime)
	{
		return Yii::app()->dateFormatter->format('yyyy-MM-dd', $mtime);
	}

	protected function tolerancia($marcacion_hora,$clase_hora_inicio){
		
		$sysvars = Variablessistema::model()->find();
		$tol_sys_antes = $sysvars->tolerancia_marcacion_temprana;
		$tol_sys_despues = $sysvars->tolerancia_marcacion_tardia;

		$tolerancia_antes = date("H:i:s",strtotime($clase_hora_inicio."-".$tol_sys_antes."minutes"));
		$tolerancia_despues = date("H:i:s",strtotime($clase_hora_inicio."+".$tol_sys_antes."minutes"));
	

		if (strtotime($marcacion_hora) >= strtotime($tolerancia_antes) && strtotime($marcacion_hora) <= strtotime($tolerancia_despues) ) {
			return TRUE;
		}else{
			return FALSE;	
		}
	}

	
	

	protected function gendate($mes_elegido,$periodo_inicio){

		$year_actual= substr($periodo_inicio,0,4);
		$fecha_elegida_inicio = $year_actual.'-'.$mes_elegido.'-01';
		$fecha_elegida_inicio = $this->generarDia($fecha_elegida_inicio);
		
		return $fecha_elegida_inicio;
	}

	/**
	 * Manages all models.
	 */
	public function actionAdmin()
	{
		$model=new Liquidaciones('search');
		$model->unsetAttributes();  // clear any default values
		if(isset($_GET['Liquidaciones']))
			$model->attributes=$_GET['Liquidaciones'];

		$this->render('admin',array(
			'model'=>$model,
		));
	}

	/**
	 * Returns the data model based on the primary key given in the GET variable.
	 * If the data model is not found, an HTTP exception will be raised.
	 * @param integer $id the ID of the model to be loaded
	 * @return Liquidaciones the loaded model
	 * @throws CHttpException
	 */
	public function loadModel($id)
	{
		$model=Liquidaciones::model()->findByPk($id);
		if($model===null)
			throw new CHttpException(404,'The requested page does not exist.');
		return $model;
	}

	/**
	 * Performs the AJAX validation.
	 * @param Liquidaciones $model the model to be validated
	 */
	protected function performAjaxValidation($model)
	{
		if(isset($_POST['ajax']) && $_POST['ajax']==='liquidaciones-form')
		{
			echo CActiveForm::validate($model);
			Yii::app()->end();
		}
	}

	protected function actionGenerarLiquidaciones($usuario,$curso,$mes){
			$monto = Categorias::model()->findByAttributes(array('id_curso'=>$curso,'id'=>$usuario));
			$horas = Asistencias::model()->findByAttributes(array('id_curso' =>$curso,'id' => $usuario,'mes'=>$mes));
			
							$model = new Liquidaciones;
						    $model->id = $usuario;
						    
						    $model->salario = $horas->asistencia_requerida * $monto->monto;

						   	$model->descuento = $horas->ausencias * $monto->monto;
						  	$model->bonificacion = 0;
						  	$model->monto_total = ($horas->asistencia_requerida-$horas->ausencias) * $monto->monto;
						  	$model->mes = $mes;
						  	$model->fecha = date('Y-m-d');
						  	
						   	$model->save();
	}
	
}
